package cn.hongwei.eduservice.controller.admin;

import cn.hongwei.eduservice.entity.Course;
import cn.hongwei.eduservice.entity.CourseDescription;
import cn.hongwei.eduservice.entity.form.CourseInfoForm;
import cn.hongwei.eduservice.entity.vo.CourseInfoVo;
import cn.hongwei.eduservice.service.CourseDescriptionService;
import cn.hongwei.eduservice.service.CourseService;
import cn.hongwei.result.R;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

/**
 * @author Great
 * @email 1224028994@qq.com
 * 课程发布
 */
@RestController
@CrossOrigin
@RequestMapping("/admin/edu/course")
public class AdminCourseController {
    @Autowired
    private CourseService courseService;

    @Autowired
    private CourseDescriptionService courseDescriptionService;

    //4、带条件查询课程列表分页数据
    @GetMapping("list/{pageNum}/{pageSize}")
    public R list(@PathVariable("pageNum") Integer pageNum,@PathVariable("pageSize") Integer pageSize){
        Page<CourseInfoVo> page=courseService.getCourseInfoVos(pageNum , pageSize);
        return R.ok().data("page",page);
    }

    //1、第一步：发布课程基本信息
    @PostMapping("save-course-info") // 请求体  以json的形式提交数据
    public R step1(@RequestBody CourseInfoForm courseInfo){//
        /*
        * 表单提交的数据 包含了两张表的数据：  course  course_description
        * course_description的id跟course的id是一一对应关系
        * */
        String courseId = courseService.saveCourseInfo(courseInfo);
        return R.ok().data("id" , courseId);
    }

    //点击上一步时,查询课程基本信息回显.根据课程id
    @GetMapping("/get-course-info/{id}")
    public R getCourseInfo(@PathVariable("id") String id){
        /*
        * 根据id查询课程和课程描述信息
        * 因为要将数据回显到(填写课程基本信息页面->step1)
        * 所以创建页面表单的对应的bean对象(CourseInfoForm)
        * 将课程属性拷贝到页面表单对象中
        * 再设置页面表单对象的"描述信息"属性,通过查询出来的描述信息对象赋值
        * 返回数据
        * */
        Course course=courseService.getById(id);
        CourseDescription courseDescription=courseDescriptionService.getById(id);

        CourseInfoForm infoForm=new CourseInfoForm();

        BeanUtils.copyProperties(course,infoForm);
        infoForm.setDescription(courseDescription.getDescription());

        return R.ok().data("item",infoForm);
    }

    //点击上一步回到课程基本信息填写页面,修改完毕,进行更新
    @PutMapping("update-course-info/{courseId}")
    public R update(@PathVariable("courseId") String courseId,@RequestBody CourseInfoForm courseInfoForm){
        /*
        * 通过课程id更新课程:
        *   首先创建一个课程对象
        *   将传递过来的id设置给创建的课程对象
        *   将前台传递过来的表单对象复制到创建的课程对象中
        *   通过id更新课程记录
        *
        * 更新对应的课程描述:
        *   创建课程描述对象
        *   将前台传递过来的id设置给信息描述对象
        *   根据页面的CourseInfoForm对象,获取描述信息,赋值给信息描述对象
        *   通过id更新信息描述记录
        * */
        Course course=new Course();
        course.setId(courseId);
        BeanUtils.copyProperties(courseInfoForm,course);
        courseService.updateById(course);

        CourseDescription courseDescription = new CourseDescription();
        courseDescription.setId(courseId);
        courseDescription.setDescription(courseInfoForm.getDescription());
        courseDescriptionService.updateById(courseDescription);

        return R.ok();
    }

    //6、发布课程
    @PutMapping("publish/{courseId}")
    public R publishCourse(@PathVariable String courseId){

//        UpdateWrapper<Course> updateWrapper = new UpdateWrapper<>();
//        /*
//            QueryWrapper:
//                查询使用： select columns...  from  table  where 条件  order by ...
//                主要用来拼接 查询的列的列表、where条件、排序...
//            UpdateWrapper:
//                更新使用： update table set column=xx ...   where 条件
//                主要用来拼接 set 的kv键值对 ， where条件
//         */
//        updateWrapper.set("status" , "Normal");
//        updateWrapper.set("publish_time" , new Date());
//        updateWrapper.eq("id" , courseId);
        LambdaUpdateWrapper<Course> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(Course::getPublishTime , new Date());
        updateWrapper.set(Course::getStatus , "Normal");
        updateWrapper.eq(Course::getId , courseId);
        courseService.update(updateWrapper);
        return R.ok();
    }

    //5、根据课程id查询发布课程的信息
    @GetMapping("getPublishCourse/{courseId}")
    public R getPublishCourse(@PathVariable String courseId){
        CourseInfoVo courseInfoVo = courseService.getPublishCourse(courseId);
        return R.ok().data("item" , courseInfoVo);
    }
}
